#include "../logs/zdflog.h"  
#include "bench.h"           

/**
 * @brief 同步日志基准测试函数
 * 测试同步模式下日志系统的性能，多线程并发写入日志文件
 * @param thread_count 测试线程数量
 * @param msg_count 每个线程要生成的日志消息数量
 * @param msglen 每条日志消息的长度(字节)
 */
void sync_bench_thread_log(size_t thread_count, size_t msg_count, size_t msglen)
{
    static int num = 1;  // 静态计数器，用于生成唯一的日志器名称
    // 构建本次测试使用的日志器名称
    std::string logger_name = "sync_bench_logger" + std::to_string(num++);
    
    // 输出测试开始信息
    LOGI("************************************************");
    LOGI("同步日志测试: %d threads, %d messages", thread_count, msg_count);

    // 创建全局日志器构建器，配置同步日志器
    zdflog::GlobalLoggerBuilder::ptr lbp(new zdflog::GlobalLoggerBuilder);
    lbp->buildLoggerName(logger_name);           // 设置日志器名称
    lbp->buildFormatter("%m");                   // 设置日志格式(只包含消息内容，减少格式化开销)
    lbp->buildSink<zdflog::FileSink>("./logs/sync.log");  // 输出到同步日志文件
    lbp->buildLoggerType(zdflog::Logger::Type::LOGGER_SYNC);  // 设置为同步日志模式
    lbp->build();  // 构建并注册日志器

    // 执行基准测试：使用指定数量的线程，每条日志长度为msglen，总日志数量为msg_count
    zdflog::bench(logger_name, thread_count, msglen, msg_count);
    
    // 输出测试结束信息
    LOGI("************************************************");
}

/**
 * @brief 异步日志基准测试函数
 * 测试异步模式下日志系统的性能，多线程并发写入日志文件
 * @param thread_count 测试线程数量
 * @param msg_count 每个线程要生成的日志消息数量
 * @param msglen 每条日志消息的长度(字节)
 */
void async_bench_thread_log(size_t thread_count, size_t msg_count, size_t msglen)
{
    static int num = 1;  // 静态计数器，用于生成唯一的日志器名称
    // 构建本次测试使用的日志器名称
    std::string logger_name = "async_bench_logger" + std::to_string(num++);
    
    // 输出测试开始信息
    LOGI("************************************************");
    LOGI("异步日志测试: %d threads, %d messages", thread_count, msg_count);

    // 创建全局日志器构建器，配置异步日志器
    zdflog::GlobalLoggerBuilder::ptr lbp(new zdflog::GlobalLoggerBuilder);
    lbp->buildLoggerName(logger_name);           // 设置日志器名称
    lbp->buildFormatter("%m");                   // 设置日志格式(只包含消息内容)
    lbp->buildSink<zdflog::FileSink>("./logs/async.log");  // 输出到异步日志文件
    lbp->buildLoggerType(zdflog::Logger::Type::LOGGER_ASYNC);  // 设置为异步日志模式
    lbp->build();  // 构建并注册日志器

    // 执行基准测试：使用指定数量的线程，每条日志长度为msglen，总日志数量为msg_count
    zdflog::bench(logger_name, thread_count, msglen, msg_count);
    
    // 输出测试结束信息
    LOGI("************************************************");
}

/**
 * @brief 综合基准测试入口
 * 依次执行多种场景下的日志性能测试，便于对比分析
 */
void bench_test()
{
    /*异步日志输出测试*/
    // 测试1个线程生成100万条日志的异步性能
    async_bench_thread_log(1, 1000000, 100);
    // 测试5个线程并发生成100万条日志的异步性能
    async_bench_thread_log(5, 1000000, 100);

    /*同步日志输出测试*/
    // 测试1个线程生成100万条日志的同步性能
    sync_bench_thread_log(1, 1000000, 100);
    // 测试5个线程并发生成100万条日志的同步性能
    sync_bench_thread_log(5, 1000000, 100);
}

/**
 * @brief 程序主入口
 * 执行日志系统的基准测试，验证不同配置下的性能表现
 * @param argc 命令行参数数量
 * @param argv 命令行参数数组
 * @return 程序退出码(0表示正常结束)
 */
int main(int argc, char *argv[])
{
    // 执行完整的基准测试套件
    bench_test();

    return 0;
}